// Procedures (过程) 示例
// 演示 Pascal 中过程的各种用法
program p_12_procedures;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 1. 简单过程 - 显示消息
procedure DisplayMessage(msg: String);
begin
  WriteLn(msg);
end;

// 2. 带多个参数的过程 - 显示个人信息
procedure DisplayPersonInfo(name: String; age: Integer);
begin
  WriteLn('姓名: ', name);
  WriteLn('年龄: ', age);
end;

// 3. 使用引用参数的过程 - 交换两个整数的值
procedure Swap(var a, b: Integer);
var
  temp: Integer;
begin
  temp := a;
  a := b;
  b := temp;
end;

// 4. 过程处理数组 - 显示整数数组的内容
procedure DisplayArray(arr: array of Integer; size: Integer);

var
  i: Integer;
begin
  Write('数组元素: ');
  for i := 0 to size - 1 do
    Write(arr[i], ' ');
  WriteLn;
end;

// 5. 过程修改数组 - 将数组中所有元素乘以2
procedure DoubleArray(var arr: array of Integer; size: Integer);
var
  i: Integer;
begin
  for i := 0 to size - 1 do
    arr[i] := arr[i] * 2;
end;

// 6. 递归过程 - 显示倒计时
procedure Countdown(n: Integer);
begin
  if n > 0 then
  begin
    WriteLn(n);
    Countdown(n - 1);
  end
  else
    WriteLn('时间到!');
end;

// 7. 过程计算并返回多个值（通过引用参数）
procedure GetMinMax(arr: array of Integer; size: Integer; var min, max: Integer);
var
  i: Integer;
begin
  if size > 0 then
  begin
    min := arr[0];
    max := arr[0];
    
    for i := 1 to size - 1 do
    begin
      if arr[i] < min then
        min := arr[i];
      if arr[i] > max then
        max := arr[i];
    end;
  end;
end;

// 所有变量声明移到这里
var
  x: Integer;
  y: Integer;
  numbers: array[0..4] of Integer;
  data: array[0..5] of Integer;
  minValue: Integer;
  maxValue: Integer;
  i: Integer;

// 程序主入口
begin
  WriteLn('=== Pascal 过程示例 ===');
  WriteLn;
  
  // 1. 调用简单过程
  WriteLn('1. 简单过程调用:');
  DisplayMessage('  欢迎学习 Pascal 过程!');
  
  WriteLn;
  
  // 2. 调用带多个参数的过程
  WriteLn('2. 多参数过程调用:');
  DisplayPersonInfo('  张三', 25);
  
  WriteLn;
  
  // 3. 引用参数过程调用
  WriteLn('3. 引用参数过程调用:');
  x := 10;
  y := 20;
  WriteLn('  交换前: x = ', x, ', y = ', y);
  Swap(x, y);
  WriteLn('  交换后: x = ', x, ', y = ', y);
  
  WriteLn;
  
  // 4. 数组过程调用
  WriteLn('4. 数组过程调用:');
  numbers[0] := 1;
  numbers[1] := 2;
  numbers[2] := 3;
  numbers[3] := 4;
  numbers[4] := 5;
  WriteLn('  调用 DisplayArray:');
  DisplayArray(numbers, 5);
  
  WriteLn('  调用 DoubleArray:');
  DoubleArray(numbers, 5);
  WriteLn('  修改后的数组:');
  DisplayArray(numbers, 5);
  
  WriteLn;
  
  // 5. 递归过程调用
  WriteLn('5. 递归过程调用:');
  Countdown(5);
  
  WriteLn;
  
  // 6. 过程返回多个值
  WriteLn('6. 过程返回多个值:');
  data[0] := 15;
  data[1] := 3;
  data[2] := 9;
  data[3] := 1;
  data[4] := 12;
  data[5] := 7;
  minValue := 0;
  maxValue := 0;
  GetMinMax(data, 6, minValue, maxValue);
  WriteLn('  数组内容:');
  DisplayArray(data, 6);
  WriteLn('  最小值: ', minValue);
  WriteLn('  最大值: ', maxValue);
  
  WriteLn;
  WriteLn('演示了 Pascal 中过程的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.